package com.aaa.jvmtest.methodarea;

/**
 * 注意：这里只是1.8的intern
 * 1.6的intern为拷贝一份，并不会指向堆内存地址
 *
 * @author Tu
 * @date 2022/6/6 15:51
 */
public class StringTable_intern {
    public static void main(String[] args) {
        //1:第一次
        //串池中：["a","b"]，在编译器会将a和b符号放入串池，new的a和b会放入堆内存，s会调用StringBulder存在堆中
        String s = new String("a") + new String("b");
        //将这个字符串对象尝试放入串池，如果有则不放，没有则放入，返回串池中对象
        //串池中：["a","b","ab"]，这里其实串池中指向的是该对象堆的地址
        String s2 = s.intern();

        System.out.println(s2 == "ab");//true 串池ab==串池ab，比较串池中的ab
        System.out.println(s == "ab");//true 串池ab==堆中ab,串池中ab指向堆内存中ab地址

        //1:第二次(先存进ab串池)
        //串池中：["ab"]
        String x = "ab";
        //串池中：["ab","a","b"]，在编译器会将a和b符号放入串池，new的a和b会放入堆内存，s会调用StringBulder存在堆中
        String c = new String("a") + new String("b");
        //将这个字符串对象尝试放入串池，如果有则不放，没有则放入，返回串池中对象
        //串池中：["ab","a","b"]，注意这里已经存在没有放入，所以没有指向堆中ab
        String c2 = s.intern();

        System.out.println(c2 == x);//true 串池ab==串池ab，比较串池中的ab
        System.out.println(c == x);//false 串池ab==堆中ab,地址不相同


    }
}
